import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

// App类是测试类
public class App {
    public static void main(String[] args) {
    // 从 Spring 中读取 Bean 对象:
        // a. 先得到 Spring (上下文)对象:
        // (1). ApplicationContext 是在 org.springframework.context.ApplicationContext 包下的.
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        System.out.println("ApplicationContext 之后的代码.");
        // (2). 该方法比较古老, 不推荐使用.
        // BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        // 面试题: ApplicationContext VS BeanFactory. ----> 见板书和课件

        // b. 从spring 中取出 bean 对象:
        // (1). getBean 中的字符串参数是和 id 属性对应的.( 根据Bean的id标识来得到Bean对象).
        User user = (User) context.getBean("user");
        // User user2 = (User) context.getBean("user2");
        // (2). 根据 Bean 类型来获取 Bean,
        //      当Spring中存在相同对象时, 该方式就会报错.
        // User user2 = context.getBean(User.class);
        // (3). 推荐的方式: 根据Bean 标识+类型 获取 Bean 对象.
        User user2 = context.getBean("user2", User.class);

        // c. 使用 Bean 对象(可选).
        System.out.println(user.sayHi());
        System.out.println(user);
        System.out.println(user2.sayHi());
        System.out.println(user2);
        System.out.println(user == user2);

        // a. 先得到 Spring (上下文)对象:
        ApplicationContext context1 =
                new ClassPathXmlApplicationContext("spring-config.xml");
        // b. 从spring 中取出 bean 对象:
        Test test = (Test) context1.getBean("test");
        // c. 使用 Bean 对象(可选).
        System.out.println(test.test());
    }
}
